<?php

class Secutiry {

	private static $allowed = array();
	private static $class;
	private static $method;

	/**
	 * Configura o array com todas as classes e suas devidas permissoes
	 * @param type Array associativo
	 * Ex.
	 * Secutiry::allow(
	 array('HomeController' => array(
	 'index' => array('required' => true, 'perfil' => array(PerfilAcesso::$cliente), 'pagina'=>'Erro'),
	 'Erro'  => array('required' => false)
	 )
	 )
	 );
	 */
	public static function allow($confClass) {
		foreach ($confClass as $key => $value) {
			foreach ($value as $k => $v) {
				self::$allowed[$key][$k] = $v;
			}
		}
	}

	/*
	 * Retorna o array contendo as casses e suas devidas permissoes.
	*/

	public static function getAllowed() {
		return self::$allowed;
	}

	/*
	 * Verifica as permissoes
	* @param nome da classe
	* @param nome do metodo
	*/

	public static function isRules($class, $method) {

		self::$class = $class;
		self::$method = $method;

		if (self::checkClass()) {
			if (self::checkMethod()) {
				if (self::checkProfille()) {
					return true;
				} else {
					return false;
				};
			}else{
				return true;
			}
		} else {
			return true;
		}
	}

	/**
	 * Verificar se a classe possui alguma restricao
	 * @return boolean
	 */
	private static function checkClass() {
		if (key_exists(self::$class, self::$allowed)) {
			return true;
		}
		return false;
	}

	/**
	 * Verifica se o methodo possui alguma restricao
	 * @return boolean
	 */
	private static function checkMethod() {
		if (key_exists(self::$method, self::$allowed[self::$class])) {
			return true;
		}
		return false;
	}

	/**
	 * Verifica se o usuario logado possui a permissao para executar o metodo
	 * @return boolean
	 */
	private static function checkProfille() {
		if (self::$allowed[self::$class][self::$method]['required']) {
			if (count(self::$allowed[self::$class][self::$method]['perfil']) > 0) {
				 
				$perfil = self::$allowed[self::$class][self::$method]['perfil'];

				if (!is_null(Session::getValue('user'))) {
					 
					$user = Session::getValue('user');
					$user = $user['perfil'];

					foreach ($perfil as $p) {
						if ($p == $user) {
							if(self::isValidToken(Session::getValue('token'))){
								return true;
							}
						}
					}
				}
				return false;
			} else {
				return false;
			}
		}
		return true;
	}

	/**
	 * Registra o usuario fornecido na sessao.
	 * @param array $user Objeto do usuario.
	 * @param string $username Login do usuario.
	 * @return Token gerado para o usuario.
	 */
	public static function registerUser($user, $username) {
		Session::setValue('user', $user);
		Session::setValue('token', self::generateToken($username));

		return Session::getValue('token');
	}

	/**
	 * Gera um token baseado no nome de usuario fornecido.
	 * @param string $username Nome do usuario.
	 * @return String do token gerado.
	 */
	private static function generateToken($username) {
		$token = $username . date("D, d M Y H:i:s", mktime()) . 'FUTURA_TOKEN';
		$token = sha1($token);

		return $token;
	}

	/**
	 * Verifica se o token fornecido esta valido na sessao.
	 * @param string $token
	 */
	private static function isValidToken($token) {

		if (Session::getValue('token')) {
			return (Session::getValue('token') == $token) ? true : false;
		}

		return false;
	}

	/**
	 * Verifica se ja existe um usuario registrado na sessao.
	 * @return True se ja existe um usuario registrado na sessao.
	 */
	private static function isAuthenticated() {
		return (Session::getValue('user')) ? true : false;
	}

	/**
	 * Desloga o usuario autenticado na sesssao.
	 */
	public static function logout() {
		Session::destroy('token');
		Session::destroy('user');
		Session::freeSession();
		return true;
	}

	/**
	 * Aplica seguranca na pagina, caso o usuario nao possua permissao de acesso a pagina,
	 * este sera redirecionado para a URL de login.
	 */
	public static function secure($class, $method) {
		if (self::isRules($class, $method)) {
			return true;
		}
		return false;
	}

	/**
	 * Retorna pagina para redirecionamento
	 * @param nome da classe
	 * @param nome do metodo
	 */
	public static function getPage($class, $method){
		return isset(self::$allowed[self::$class][self::$method]['pagina']) ? self::$allowed[self::$class][self::$method]['pagina'] : FALSE;
	}

}
?>